package com.backend.demo.baseDAO;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.backend.demo.page.PageBean;

/**
 * hibernate接口类
 * @author Administrator
 *
 * @param <T>
 * @param <ID>
 */
public interface IBaseDao<T, ID extends Serializable> {
    
    /**
     * 保存实体
     * @param t 实体参数
     * @return 返回保存的实体个数
     */
    public abstract int save(T t);
 
    /**
     * 保存或者更新实体
     * @param t 实体
     * @return 更新或者保存的个数
     */
    public abstract int saveOrUpdate(T t);
    
    /**
     * 批量保存实体
     * @param collections
     */
    public abstract void saveOrUpdateBatch(Collection<T> collections);
 
    /**
     * 加载实体的load方法
     * @param id 实体的id
     * @return 查询出来的实体
     */
    public abstract T load(ID id);
 
    /**
     * 查找的get方法
     * @param id 实体的id
     * @return 查询出来的实体
     */
    public abstract T get(ID id);
 
    /**
     * contains
     * @param t 实体
     * @return 是否包含
     */
    public abstract boolean contains(T t);
 
    /**
     * delete
     * 删除表中的t数据
     * @param t 实体
     * @return 删除的条数
     */
    public abstract int delete(T t);
 
    /**
     * 根据ID删除数据
     * @param Id 实体id
     * @return 是否删除成功
     */
    public abstract int deleteById(ID Id);
    
    /**
     * 批量删除
     * @param ids
     */
    public void deleteBatchById(ID[] ids);
 
    /**
     * 删除所有
     * @param entities 实体的Collection集合
     */
    public abstract void deleteAll(Collection<T> entities);
     
    /**
     * 执行Hql语句
     * @param hqlString hql
     * @param values 不定参数数组
     * @return 结果数
     */
    public abstract int updateOrDeleteByHql(String hqlString, Object... values); 
     
    /**
     * 执行Sql语句
     * @param sqlString sql
     * @param values 不定参数数组
     * @return 结果数
     */
    public abstract int updateOrDeleteBySql(String sqlString, Object... values); 
 
    /**
     * 根据HQL语句查找唯一实体
     * @param hqlString HQL语句
     * @param values 不定参数的Object数组
     * @return 查询实体
     */
    public abstract T getOneByHQL(String hqlString, Object... values);
 
    /**
     * 根据SQL语句查找唯一实体
     * @param sqlString SQL语句
     * @param values 不定参数的Object数组
     * @return 查询实体
     */
    public abstract T getOneBySQL(String sqlString, Object... values);
 
    /**
     * <根据HQL语句，得到对应的list>
     * @param hqlString HQL语句
     * @param values 不定参数的Object数组
     * @return 查询多个实体的List集合
     */
    public abstract List<T> getListByHQL(String hqlString, Object... values);
 
    /**
     * <根据SQL语句，得到对应的list>
     * @param sqlString HQL语句
     * @param values 不定参数的Object数组
     * @return 查询多个实体的List集合
     */
    public abstract List<T> getListBySQL(String sqlString, Object... values);
     
 
    /**
     * refresh
     * @param t 实体
     */
    public abstract void refresh(T t);
 
    /**
     * update
     * @param t 实体
     * @return 结果数
     */
    public abstract int update(T t);
 
    /**
     * 根据HQL得到记录数
     * @param hql HQL语句
     * @param values 不定参数的Object数组
     * @return 记录总数
     */
    public abstract Long countByHql(String hql, Object... values);
     
    /**
     * HQL分页查询
     * @param hql HQL语句
     * @param countHql 查询记录条数的HQL语句
     * @param pageNo 下一页
     * @param pageSize 一页总条数
     * @param values 不定Object数组参数
     * @return PageBean<T>的封装类，里面包含了页码的信息
     */
    public abstract PageBean<T> findPageByFetchedHql(String hql, String countHql, int pageNo, int pageSize, Object... values);
}